home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
MACD 5
/
MACD 5.bin
/
workbench
/
libs
/
patchlib539.lha
/
patchlib
/
autodocs
/
patch.doc
Wrap
Text File
|
1996-12-09
|
34KB
|
999 lines
TABLE OF CONTENTS
patch.library/AddPatchNotifyA
patch.library/CreatePatchProjectA
patch.library/FindPatch
patch.library/FindPatchTagsA
patch.library/GetPatchA
patch.library/InstallPatch
patch.library/InstallPatchTagsA
patch.library/PatchAlloc
patch.library/PatchFreeVec
patch.library/RemovePatch
patch.library/RemovePatchProjectA
patch.library/RemovePatchTagsA
patch.library/RemPatchNotifyA
patch.library/SetPatchA
patch.library/SetPatchProjectA
patch.library/WaitRemovePatch
patch.library/AddPatchNotifyA patch.library/AddPatchNotifyA
NAME
AddPatchNotifyA -- Get messages, if a patch is changed. (V5)
AddPatchNotify -- varargs stub for AddPatchNotifyA(). (V5)
SYNOPSIS
Error = AddPatchNotifyA( msgport, taglist )
D0 A0 A1
ULONG Error AddPatchNotifyA( struct MsgPort *, struct TagItem *);
Error = AddPatchNotify( msgport, firsttag, ...)
ULONG Error AddPatchNotify( struct MsgPort *, Tag, ...);
FUNCTION
Start sending out notification requests to the given messageport, if
a patch is added, removed or changed.
INPUTS
msgport = pointer to msgport ready to receive messages or
null for no action
taglist = pointer to array of tags
TAGS
PATT_Priority (BYTE) - Optional priority for the notification request
Normally only the priorities +5, 0, -5 should be used.
RESULT
Error = errorcode as defined in patch.h.
PATERR_Ok
Indicates success of the operation.
PATERR_OutOfMem
Indicates that there was not enough memory to
complete the operation.
NOTES
BUGS
SEE ALSO
RemPatchNotify(), patch.h
patch.library/CreatePatchProjectA patch.library/CreatePatchProjectA
NAME
CreatePatchProjectA -- Create an instance of a patch project. (V4)
CreatePatchProject -- varargs stub for CreatePatchProjectA(). (V4)
SYNOPSIS
project = CreatePatchProjectA( projectname, taglist )
D0 A0 A1
APTR CreatePatchProjectA( STRPTR, struct TagItem *);
project = CreatePatchProject( projectname, firsttag, ...)
APTR CreatePatchProject( STRPTR, Tag, ...);
FUNCTION
Create an instance of a patch project.
This instance may be used to manipulate or remove patches belonging
to one project (or program) with one function call.
The projectname will be copied into an internal buffer.
INPUTS
projectname = pointer to name of the patch project
taglist = pointer to array of tags
TAGS
none defined yet
RESULT
project = pointer to patch projects private structure or
null on failure
NOTES
BUGS
SEE ALSO
RemovePatchProject(), InstallPatchTags(), patch.h
patch.library/FindPatch patch.library/FindPatch
NAME
FindPatch -- find a patch structure with a given name.
SYNOPSIS
patch = FindPatch( Name )
D0 A0
struct Patch *FindPatch( STRPTR );
FUNCTION
This function will search the patch.library lists for a
patch structure with the given name. The first patch matching
this name will be returned.
This function exists only for historic reasons.
It will internally be routed to FindPatchTags().
INPUTS
Name = Name of the patch structure to find
RESULT
patch = a pointer to the patch structure with the same name else
zero to indicate that the string was not found.
NOTES
If your task is not the owner of the patch, the
pointer is only valid as long as the system is in forbid().
From V2 on you may also lock the patch.library semaphore
before calling this function. In this case a pointer to
a patch structure is guaranteed to be valid, until you
release the semaphore. The semaphore, however, should be kept
locked only for short periods of time in order not to block
other tasks.
BUGS
SEE ALSO
InstallPatch(), RemovePatch(), Patch.h
patch.library/FindPatchTagsA patch.library/FindPatchTagsA
NAME
FindPatchTagsA -- find a patch structure with certain criteria. (V3)
FindPatchTags -- varargs stub for FindPatchTagsA(). (V3)
SYNOPSIS
object = FindPatchTagsA( taglist )
D0 A0
APTR FindPatchTagsA( struct TagItem *);
object = FindPatchTags( firsttag, ...)
APTR FindPatchTags( Tag, ...);
FUNCTION
This function will search the patch.library lists for a
patch structure, that matches the criteria specified in the taglist.
The first matching patch will be returned.
INPUTS
taglist = pointer to array of tags
TAGS
Specify only one of these at a time:
PATT_PatchName (STRPTR) - Specifies that patch.library should
search for the occurrence of a patch of the given name.
PATT_ProjectName (V4) (STRPTR) - Specifies that patch.library should
search for the occurrence of a project of the given name.
PATT_NoCase (V4) (BOOL) - If specified with PATT_PatchName or
PATT_ProjectID string-comparison will be case-independent.
International characters are not respected with this version
of patch.library.
This may or may not change in the future.
PATT_LastObject (V4) (APTR) - This tag allows to search for multiple
matching objects. Simply specify the result of an previous
call to FindPatchTags() to continue searching with this tag.
You may also specify NULL to start searching the lists from
the beginning. Keep in mind, that you must make sure, that
the pointer is valid (see notes).
RESULT
object = a pointer to the object as requested within the taglist or
zero to indicate that no match was found.
NOTES
If your task is not the owner of the patch, the
pointer is only valid as long as the system is in forbid().
You may also lock the patch.library semaphore
before calling this function. In this case a pointer to
a patch structure is guaranteed to be valid, until you
release the semaphore. The semaphore, however, should be kept
locked only for short periods of time in order not to block
other tasks.
BUGS
SEE ALSO
InstallPatchTags(), RemovePatchTags(), PatchTags.h
patch.library/GetPatchA patch.library/GetPatchA
NAME
GetPatchA -- Returns certain attributes of a patch. (V3)
GetPatch -- varargs stub for GetPatchA(). (V3)
SYNOPSIS
Result = GetPatchA( patch, taglist )
D0 A0 A1
ULONG Result GetPatchA( struct Patch *, struct TagItem *);
Result = GetPatch( patch, firsttag, ...)
ULONG Result GetPatch( struct Patch *, Tag, ...);
FUNCTION
Returns certain attributes and lists connected to a patch (see TAGS).
INPUTS
patch = pointer to a patch structure or NULL for no action
taglist = pointer to array of tags
TAGS
PATT_Result2 (APTR) - An optional pointer to a longword, which will
contain an errorcode as defined patch.h, when
the function returns.
Assembler programmers can get the same value from d1.
Only one of the following tags may be specified at a time:
PATT_PatchName (BOOL) - Return a pointer to a copy of the name of
the patch in a null-terminated string.
This pointer must be passed to PatchFreeVec(), if
the string is no longer needed.
Type of Result is STRPTR.
PATT_TaskListType (BOOL) - Return the type of the internal TaskList
Possible results:
TL_TYPE_INCLUDE: all specified tasks will use the patchroutine,
all others will ignore it.
TL_TYPE_EXCLUDE: all specified tasks will ignore the patchroutine,
all others will use it.
NULL: An error occurred (this includes the absence of
a TaskList). Check the secondary errorcode for
more information.
Type of Result is ULONG.
PATT_TaskList (BOOL) - Return a pointer to a taglist containing all
tasknames, taskids or patterns attached to a patch.
The tagitems are PATT_AddTaskName, PATT_AddTaskID or
PATT_AddTaskPattern(new for V5). Unknown tags must be ignored.
This pointer must be passed to PatchFreeVec(), if
the tasklist is no longer needed.
Type of Result is taglist.
PATT_Disabled (V4) (BOOL) - Return a number representing the current
disable nesting counter of a patch. Null means the patch is
enabled and will be used, by any tasks using the
library function.
Type of Result is ULONG.
PATT_UserData (V5) (BOOL) - Return userdata attached to a patch.
Type of Result is ULONG.
PATT_Priority (V5) (BOOL) - Return the priority of a patch.
Type of Result is BYTE.
RESULT
Result = Pointer or longword depending on specified tags.
Possible errorcodes returned with PATT_Result2 or in register d1:
PATERR_Ok
Indicates success of the operation.
PATERR_OutOfMem
Indicates that there was not enough memory to
complete the operation.
PATERR_InvalidHandle
Indicates that the pointer to the patch passed
to the function was not or is no longer valid.
This might happen, if you pass a wrong pointer or
you got the pointer via FindPatch() and another
task has removed the patch before this task called
RemovePatchTags().
PATERR_NoTaskList
No valid TaskList is attached to the patch.
The SetPatchA() function with the PATT_CreateTaskList tag
specified, must be called to allocate a TaskList.
PATERR_PatchUnnamed
The patch has no identification string attached to it.
NOTES
BUGS
SEE ALSO
InstallPatchTags(), PatchFreeVec(), Patch.h, PatchTags.h
patch.library/InstallPatch patch.library/InstallPatch
NAME
InstallPatch -- Installs a patchroutine for library functions.
SYNOPSIS
patch = InstallPatch( newPatch )
D0 A0
struct Patch *InstallPatch( struct NewPatch * );
FUNCTION
This function exists only for historic reasons. It will internally
routed back to InstallPatchTags(). Because InstallPatchTags()
has advanced features there is definitely no need to call this
function at all.
INPUTS
NewPatch = pointer to an instance of a NewPatch structure
RESULT
patch = pointer to a Patch structure or NULL on failure
NOTES
BUGS
SEE ALSO
InstallPatchTags(), patchobsolete.h
patch.library/InstallPatchTagsA patch.library/InstallPatchTagsA
NAME
InstallPatchTagsA -- Installs a patchcode for library functions. (V2)
InstallPatchTags -- varargs stub for InstallPatchTagsA(). (V2)
SYNOPSIS
patch = InstallPatchTagsA( funcEntry, funcOffset, tagList )
D0 A0 D0 A1
struct Patch *InstallPatchTagsA( APTR, UWORD, struct TagItem * );
patch = InstallPatchTags( funcEntry, funcOffset, firsttag, ...)
struct Patch *InstallPatchTags( APTR, UWORD, Tag, ...);
FUNCTION
Adds a user provided routine to a library function.
NEW for V3: An internal call to SetPatch() will be made.
So all tags which are valid with SetPatch() may be specified in the
taglist.
INPUTS
funcEntry = pointer to the entry of the function to add
funcOffset = Library Offset Vector (LVO) of the function to patch
taglist = pointer to array of tags
TAGS
PATT_LibraryName (STRPTR) - Specifies that you want to patch a library
of the given name ( as in exec.library/OpenLibrary() ).
Either PATT_LibraryName, PATT_DeviceName or PATT_LibraryBase
MUST be specified.
PATT_DeviceName (STRPTR) - Specifies that you want to patch a device
of the given name ( as in exec.library/OpenDevice() ).
Either PATT_LibraryName, PATT_DeviceName or PATT_LibraryBase
MUST be specified.
PATT_LibraryBase (struct Library *) Specifies that you want to patch
a library, device or resource with the given base.
You may get such a pointer by calling one of the following
exec functions: OpenLibrary(), OpenDevice(), OpenResource()
You may safely close this library, if InstallPatchTags()
returns, because patch.library will increase the OpenCount
to make sure, that the library won't be removed from the
system as long as there are patches installed.
V4: The OpenCount will not be increased, if the PatchSupervisor
support program is active.
Either PATT_LibraryName, PATT_DeviceName or PATT_LibraryBase
MUST be specified.
PATT_LibVersion (ULONG) - Versionnumber for exec.library/OpenLibrary.
Optional in conjunction with PATT_LibraryName.
Should be specified, if a function is available only
from a certain library version on.
Default is NULL (any version).
PATT_DevFlags (ULONG) - Flags for exec.library/OpenDevice().
Optional in conjunction with PATT_DeviceName. Default is NULL.
PATT_DevUnit (ULONG) - Unit for exec.library/OpenDevice().
Optional in conjunction with PATT_DeviceName. Default is NULL.
PATT_PatchName (STRPTR) - An optional pointer to a string, which can
be used to search for a patch with FindPatch() or FindPatchTags().
The null-terminated string will be copied, so you may free
its memory when InstallPatchTags() returns. The string should
identify the program that installed the patch.
Even though this tag is optional, the use of it is strongly
encouraged, because without it certain future enhancements
of the patch.library may not work (e.g.: saving of user-settings).
PATT_Priority (BYTE) - Priority of the patch
valid range: -127...+126
It indicates the sequence of patches, if more than one patch
for a function is to be installed.
The original code has a priority of 0.
Priority: Meaning:
>0: patch will be executed before the original
<0: patch will be executed after the original
=0: patch will be executed instead of the original (default)
Normally only the priorities +5, 0, -5 should be used.
PATT_NewCodeSize (ULONG) - Optional length of the patch code to be
installed.
If this field is set to the correct value the PC-RELATIVE
patch code starting at funcEntry will be copied into an
internal buffer. So it is possible to deallocate the
patch code after InstallPatchTags() returned.
PATT_Result2 (APTR) - An optional pointer to a longword, which will
contain an errorcode as defined patch.h, when
the function returns.
Assembler programmers can get the same value from d1.
PATT_ProjectID (APTR) (V4) - Optional pointer to a PatchProject as
created by a CreatePatchProject() function call, indicating
that the newly installed patch belongs to one project or program.
If used together with the RemovePatchProject() function
many patches can be removed with one function call.
PATT_UseXResult (BOOL) (V5) - If this tag is set to TRUE, your patchcode
MUST return a PatchXResult structure in d0.
See PatchAlloc for more informations.
For more tags see the description of SetPatch().
RESULT
patch = pointer to a patch structure or NULL on failure
Errorcodes returned with PATT_Result2, NPAT_Result2 or in register d1:
Note that from V3 on errorcodes may be returned, even if patch is a
valid pointer, indicating a failure in the internal SetPatch() call.
Previous versions always set PATERR_Ok, if patch was a valid pointer.
PATERR_Ok
Indicates success of the operation.
PATERR_OutOfMem
Indicates that there was not enough memory to
complete the operation.
PATERR_OpenLib
The operation failed, because the exec.library
function OpenLibrary() failed. Check the Autodocs
for more informations about OpenLibrary().
PATERR_OpenDev
The operation failed, because the exec.library
function OpenDevice() failed. Check the Autodocs
for more informations about OpenDevice().
PATERR_FuncNotStd
The library offset vector of the function to patch
was not in format that patch-library can accept.
Patch.library can handle the following formats:
jmp xxxxxx
moveq.l #xx,Dx bra.l xxxx
moveq.l #xx,Dx bra.s xx
Note that this is the type of error returned,
if you are trying to patch a function that uses
in-line code such as the exec.library/GetCC() function.
PATERR_InvalidTags
An error occurred while parsing the specified Tags
(e.g.: EITHER PATT_LibraryName, PATT_DeviceName or
PATT_LibraryBase MUST be used with InstallPatchTags() )
For more errorcodes see the description of SetPatch().
NOTES
This function may implicitly call dos.library functions, so do not
call it from tasks.
BUGS
Up to V4 it was not possible to pass pathnames with PATT_LibraryName or
PATT_DeviceName (e.g.: "Work:libs/foo.library"). This has been fixed
in V5.
SEE ALSO
RemovePatchTags(), RemovePatchProject(), SetPatch(), PatchAlloc(),
Patch.h, PatchTags.h, exec.library/OpenLibrary(),
exec.library/OpenDevice()
patch.library/PatchAlloc patch.library/PatchAlloc
NAME
PatchAlloc -- Allocate and initialize structures (V5)
SYNOPSIS
structure = PatchAlloc(type)
D0
void *PatchAlloc(ULONG type);
FUNCTION
Allocate and initialize structures for use with patch.library.
NOTE
Call PatchFreeVec() to free the memory unless documented otherwise.
INPUTS
type = type of structure to allocate
Currently defined types:
PS_TYPE_XRESULT - Allocate a PatchXResult structure used
in conjunction with the Extended-Result-System
(See Example below)
RESULT
structure = pointer to a structure or NULL on failure
EXAMPLE
To add 30 ticks to the each dos.library/Delay() function
your patchcode would look like this (in SAS/C):
__asm __saveds struct PatchXResult *MyDelay(register __d1 ULONG ticks)
{
struct PatchXResult *xresult;
ticks += 30;
if (xresult = (struct PatchXResult *)PatchAlloc(PS_TYPE_XRESULT))
{
xresult->pxr_RegD1 = ticks;
xresult->pxr_RegPattern = PATREG_D1;
}
return(xresult);
}
SEE ALSO
GetPatch(), exec.library/FreeVec
patch.library/PatchFreeVec patch.library/PatchFreeVec
NAME
PatchFreeVec -- free memory allocated by GetPatch() (V3)
SYNOPSIS
PatchFreeVec(memoryBlock)
A1
void PatchFreeVec(void *);
FUNCTION
Free a memory allocation made by the GetPatch() call. The memory will
be returned to the system pool from which it came.
NOTE
INPUTS
memoryBlock - pointer to the memory block to free, or NULL.
SEE ALSO
GetPatch(), exec.library/FreeVec
patch.library/RemovePatch patch.library/RemovePatch
NAME
RemovePatch -- Removes a patch installed by InstallPatch().
SYNOPSIS
Error = RemovePatch( patch )
D0 A0
ULONG Error RemovePatch( struct Patch * );
FUNCTION
This function is obsolete from V2 on, use RemovePatchTags() instead.
It effectively calls the new function
RemovePatchTags(patch, PATT_DelayedExpunge, FALSE, TAG_DONE)
INPUTS
patch = pointer to the patch structure or NULL for no action
RESULT
Error = errorcode as defined in patch.h.
(for more information see RemovePatchTags() )
NOTES
BUGS
SEE ALSO
RemovePatchTags(), Patch.h
patch.library/RemovePatchProjectA patch.library/RemovePatchProjectA
NAME
RemovePatchProjectA -- Remove all patches from the same project. (V4)
RemovePatchProject -- varargs stub for RemovePatchProjectA(). (V4)
SYNOPSIS
Error = RemovePatchProjectA( project, taglist )
D0 A0 A1
ULONG Error RemovePatchProjectA( APTR, struct TagItem *);
Error = RemovePatchProject( project, firsttag, ...)
ULONG Error RemovePatchProject( APTR, Tag, ...);
FUNCTION
Remove all patches from the given project.
This function simplifies the way, patches can be removed:
- All patches belonging to one project will be disabled
- The function then waits (depending on PATT_Timeout) until
the usagecounter of all patches becomes zero
- Now all patches will be removed via RemovePatchTags()
- If all patches are removed resources connected to the
project will be deallocted
You may call this function to cleanup a project, even if no
patch was successfully installed for this project.
INPUTS
project = pointer to a patch project obtained via CreatePatchProject()
taglist = pointer to array of tags
TAGS
same as RemovePatchTags()
RESULT
Error = errorcode as defined in patch.h.
same as RemovePatchTags()
NOTES
Removing a patch routine can never be made absolutely safe.
Although patch.library does anything possible to provide methods
to minimize the chance of a crash, there will always be a
slight chance.
So minimize the number of install and remove operations.
BUGS
SEE ALSO
CreatePatchProject(), InstallPatchTags(), RemovePatchTags(),
Patch.h, PatchTags.h
patch.library/RemovePatchTagsA patch.library/RemovePatchTagsA
NAME
RemovePatchTagsA -- Removes an installed patch. (V2)
RemovePatchTags -- varargs stub for RemovePatchTagsA(). (V2)
SYNOPSIS
Error = RemovePatchTagsA( patch, taglist )
D0 A0 A1
ULONG Error RemovePatchTagsA( struct Patch *, struct TagItem *);
Error = RemovePatchTags( patch, firsttag, ...)
ULONG Error RemovePatchTags( struct Patch *, Tag, ...);
FUNCTION
Removes a patch from a library function.
All allocated resources for that specific patch will
be deallocated.
INPUTS
patch = pointer to a patch structure or NULL for no action
taglist = pointer to array of tags
TAGS
PATT_TimeOut (ULONG) - The number of ticks (1/50 seconds) the
function keeps trying to remove the patch, if another task
is running in the patchcode.
If the patch.library does not succeed in the given time the
function will return PATERR_PatchInUse.
Defaults to NULL, which means no retry.
PATT_DelayedExpunge (BOOL) - If this tag is not set to FALSE and a
non-patch.library patch was installed after the patch.library
patch for a specific library function the specified patch
will nevertheless be removed.
BUT some resources will be kept allocated by patch.library
(e.g.: the Library Offset Vector will not be restored to its
old state). Patch.library will try to deallocate these
resources automatically, if the system is getting low on
memory or if a call to a patch.library function that
removes or installs patches is made.
The default is TRUE !!!
RESULT
Error = errorcode as defined in patch.h.
PATERR_Ok
Indicates success of the operation.
PATERR_PatchInUse
Indicates that some other task is using the
installed function and the patch can't be removed now.
Your task may wait and try again later.
PATERR_PatchInstalled
Indicates that a patchcode has been installed for
that function after your patch.library patch has
been installed and your patch is the only
patch.library patch for that function.
If patch.library would remove your patch
tasks would jump into deallocated memory
Result: blinking borders.
Never occurs, if you pass in the tag
PATT_DelayedExpunge with TRUE.
PATERR_InvalidHandle
Indicates that the pointer to the patch passed
to the function was not or is no longer valid.
This might happen, if you pass a wrong pointer or
you got the pointer via FindPatch() and another
task has removed the patch before this task called
RemovePatchTags().
Also keep in mind that ln_Type must be PS_TYPE_USER.
NOTES
Removing a patch routine can never be made absolutely safe.
Although patch.library does anything possible to provide methods
to minimize the chance of a crash, there will always be a
slight chance.
So minimize the number of install and remove operations.
This function may implicitly call dos.library functions, so do not
call it from tasks.
BUGS
SEE ALSO
InstallPatchTags(), RemovePatchProject(), Patch.h, PatchTags.h
patch.library/RemPatchNotifyA patch.library/RemPatchNotifyA
NAME
RemPatchNotifyA -- Stop receiving messages, if a patch is changed. (V5)
RemPatchNotify -- varargs stub for RemPatchNotifyA(). (V5)
SYNOPSIS
Error = RemPatchNotifyA( msgport, taglist )
D0 A0 A1
ULONG Error RemPatchNotifyA( struct MsgPort *, struct TagItem *);
Error = RemPatchNotify( msgport, firsttag, ...)
ULONG Error RemPatchNotify( struct MsgPort *, Tag, ...);
FUNCTION
Stop recieving notification requests for the given messageport.
The messageport should have been used in a previous call to
AddPatchNotify(). Before deallocating your MsgPort you must
still reply outstanding messages.
INPUTS
msgport = pointer to msgport or null for no action
taglist = pointer to array of tags
TAGS
none defined yet
RESULT
Error = errorcode as defined in patch.h.
PATERR_Ok
Indicates success of the operation.
NOTES
BUGS
SEE ALSO
AddPatchNotify(), patch.h
patch.library/SetPatchA patch.library/SetPatchA
NAME
SetPatchA -- Changes certain attributes of a patch. (V3)
SetPatch -- varargs stub for SetPatchA(). (V3)
SYNOPSIS
Error = SetPatchA( patch, taglist )
D0 A0 A1
ULONG Error SetPatchA( struct Patch *, struct TagItem *);
Error = SetPatch( patch, firsttag, ...)
ULONG Error SetPatch( struct Patch *, Tag, ...);
FUNCTION
Changes certain attributes of a patch (see TAGS).
INPUTS
patch = pointer to a patch structure or NULL for no action
taglist = pointer to array of tags
TAGS
PATT_CreateTaskList (ULONG) - Create a TaskList of the given type:
TL_TYPE_INCLUDE: all specified tasks will use the patchroutine,
all others will ignore it.
So if no Task is specified via PATT_AddTask... tags,
the patchroutine will be used for NO tasks!
TL_TYPE_EXCLUDE: all specified tasks will ignore the patchroutine,
all others will use it.
So if no Task is specified via PATT_AddTask... tags,
the patchroutine will be used for ALL tasks!
PATT_DeleteTaskList (BOOL) - Delete any existing TaskList
This will return the patch to its default behaviour, which is to call
the patchroutine for any task.
It is not required to remove the TaskList, before you remove a patch,
(via RemovePatchTags()) because this will automatically be done
by patch.library.
PATT_AddTaskID (struct Task *) - Add a task address to the patch TaskList.
Patch.library takes care that one TaskID appears only once in the
TaskList.
Unlike many tags, you may specify this tag more than once in one
taglist to add multiple tasks to the list.
PATT_AddTaskName (STRPTR) - Add a task of the given name to address to
the patch TaskList. The string will be copied into an
internal buffer.
Patch.library takes care that one TaskName appears only once in the
TaskList.
Unlike many tags, you may specify this tag more than once in one
taglist to add multiple tasks to the list.
PATT_RemTaskID (struct Task *) - Remove a task address from the TaskList
Unlike many tags, you may specify this tag more than once in one
taglist to remove multiple tasks from the list.
PATT_RemTaskName (APTR) - Remove a task of the given name from the
TaskList.
Unlike many tags, you may specify this tag more than once in one
taglist to remove multiple tasks from the list.
PATT_Disabled (V4) (BOOL) - Enable (False) or disable (True) a patch.
For disabling a patch a nesting counter is provided.
In order to restore normal patch execution, the programmer must
provide exactly one call to 'enable' for every 'disable'.
If a patch is disabled this does not mean, that no task continues to
use the patched code. It only makes sure, that no further tasks enter
the patch code.
If PATT_Disabled,TRUE is set with InstallPatchTags() the patch will
not be called until explicitly enabled by a call to SetPatchTags().
PATT_AddRemoveHook (V4) (struct Hook *) - Add a Hook, which is called by
patch.library whenever a patch is removed from memory. Neither
the Hook structure nor the hookfunction are copied into internal
memory. So freeing these structures must be accomplished by the
hookfunction itself. It must also preserve all registers.
The hookobject (Register A2) for this hook is the patch structure.
For more information about hooks see utility/hooks.h,
utility.library/CallHook() or the RKMs.
Unlike many tags, you may specify this tag more than once in one
taglist to add multiple hooks.
PATT_RemRemoveHook (V4) (struct Hook *) - Remove a Hook installed
with PATT_AddRemoveHook.
Unlike many tags, you may specify this tag more than once in one
taglist to remove multiple hooks.
PATT_UserData (V5) (ULONG) - Attach userdata to a patch.
Use this tag only, if you are the owner (creator) of the patch.
PATT_AddTaskPattern (V5) (STRPTR) - Add a pattern of tasknames to the patch
TaskList. The pattern may contain dos wildcards.
Patch.library takes care that one pattern appears only once in the
TaskList.
Unlike many tags, you may specify this tag more than once in one
taglist to add multiple patterns to the list.
This tag only works with kickstart V37+.
DO NOT USE this tag, if you patch one of the following dos-functions:
MatchPattern() or MatchPatternNocase()
PATT_RemTaskPattern (V5) (STRPTR) - Remove a taskpattern from the
TaskList.
Unlike many tags, you may specify this tag more than once in one
taglist to remove multiple patterns from the list.
PATT_StackSize (V5) (ULONG) - Minimum stacksize (in bytes) your function
requires. This value should be a multiple of 4 and more than 256.
If a taskpattern (see PATT_AddtaskPattern) is active,
at least 1500 Bytes should be specified.
DO NOT USE this tag, if you patch one of the following exec-functions:
FindTask(), AllocMem(), FreeMem() or StackSwap()
You may specify zero to turn stack extension off.
PATT_Priority (V5) (BYTE) - Priority of the patch
valid range: -127...+126
It indicates the sequence of patches, if more than one patch
for a function is to be installed.
The original code has a priority of 0.
Priority: Meaning:
>0: patch will be executed before the original
<0: patch will be executed after the original
=0: patch will be executed instead of the original (default)
Normally only the priorities +5, 0, -5 should be used.
Changing the priority of an active patch is a difficult
operation. It may fail with PATERR_PatchInUse.
You MUST NOT change the priority of a patch in respect
to the original function (see above).
RESULT
Error = errorcode as defined in patch.h.
PATERR_Ok
Indicates success of the operation.
PATERR_OutOfMem
Indicates that there was not enough memory to
complete the operation.
PATERR_PatchInUse
Indicates that some other task is using the
installed function and the priority of the patch can't
be changed right now.
Your task may wait and try again later.
PATERR_InvalidHandle
Indicates that the pointer to the patch passed
to the function was not or is no longer valid.
This might happen, if you pass a wrong pointer or
you got the pointer via FindPatch() and another
task has removed the patch before this task called
RemovePatchTags().
PATERR_NoTaskList
No valid TaskList is attached to the patch.
The SetPatchA() function with the PATT_CreateTaskList tag
specified, must be called to allocate a TaskList.
PATERR_TaskListExists
PATT_CreateTaskList was specified, but there already
exists a TaskList.
PATERR_InvalidTaskList
PATT_CreateTaskList was specified with a wrong parameter
PATERR_KickTooOld
PATT_AddTaskPattern was used on a system with Kickstart V36
or lower.
PATERR_InvalidPattern
PATT_AddTaskList was used with a string, which contained an
invalid pattern. See dos.library ParsePattern() for more
informations.
PATERR_Restricted
PATT_AddTaskPattern or PATT_StackSize was used for a
forbidden function (see TAGS).
NOTES
Using the TaskList feature provided by this function will
(by a huge amount in the case of PATT_AddTaskPattern) increase
the stackusage of the patched function.
See PATT_StackSize for a solution.
BUGS
SEE ALSO
InstallPatchTags(), Patch.h, PatchTags.h, dos.library/ParsePatternNoCase(),
dos.library/ParsePattern()
patch.library/SetPatchProjectA patch.library/SetPatchProjectA
NAME
SetPatchProjectA -- Changes certain attributes of a project. (V5)
SetPatchProject -- varargs stub for SetPatchProjectA(). (V5)
SYNOPSIS
Error = SetPatchProjectA( project, taglist )
D0 A0 A1
ULONG Error SetPatchProjectA( project, struct TagItem *);
Error = SetPatchProject( project, firsttag, ...)
ULONG Error SetPatchProject( project, Tag, ...);
FUNCTION
Changes certain attributes of a group of patches belonging to one
project. For now (V5) it mainly calls SetPatch() recursively for
all patches belonging to the project.
Certain project specific tags may be implemented later.
INPUTS
project = pointer to a patch project obtained via CreatePatchProject()
or NULL for no action
taglist = pointer to array of tags
TAGS
see SetPatch() for a list of valid tags.
RESULT
Error = errorcode as defined in patch.h.
see SetPatch() for a list of errorcodes
NOTES
Currently (V5) SetPatchProject() stops changing patches, when any of
the internal calls to SetPatch() return an error. Therefore when
SetPatchProject() returns an error, some patches may have been changed
and others not.
BUGS
SEE ALSO
SetPatch(), Patch.h, PatchTags.h,
patch.library/WaitRemovePatch patch.library/WaitRemovePatch
NAME
WaitRemovePatch -- Waits until it is possible to remove a patch.
SYNOPSIS
Error = WaitRemovePatch( patch )
D0 A0
ULONG Error WaitRemovePatch( struct Patch * );
FUNCTION
This function is obsolete from V2 on, use RemovePatchTags() instead.
It effectively calls the new function
RemovePatchTags(patch, PATT_TimeOut, 0x7fffffff,
PATT_DelayedExpunge, FALSE,
TAG_DONE)
INPUTS
patch = pointer to the patch structure or NULL for no action
RESULT
Error = errorcode as defined in patch.h.
(for more information see RemovePatchTags() )
NOTES
BUGS (?)
This function will never return, if the patched library function
crashed for some reason.
SEE ALSO
RemovePatchTags()